package health_system.health_system.service;


import health_system.health_system.entity.LoginRecord;
import health_system.health_system.entity.User;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 登录记录服务接口
 */
public interface LoginRecordService {
    
    /**
     * 记录用户登录信息
     *
     * @param user 登录用户
     * @param request HTTP请求对象，用于获取IP地址、设备信息等
     * @param loginStatus 登录状态
     * @param failReason 失败原因（如果登录失败）
     * @return 创建的登录记录
     */
    LoginRecord recordLogin(User user, HttpServletRequest request,
                            LoginRecord.LoginStatus loginStatus, String failReason);
    
    /**
     * 根据用户ID查询其登录记录
     *
     * @param userId 用户ID
     * @param pageable 分页参数
     * @return 分页的登录记录
     */
    Page<LoginRecord> getUserLoginRecords(Long userId, Pageable pageable);
    
    /**
     * 查询用户最近登录记录
     *
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 最近的登录记录列表
     */
    List<LoginRecord> getRecentLoginRecords(Long userId, int limit);
    
    /**
     * 查询用户最后一次成功登录记录
     *
     * @param userId 用户ID
     * @return 最后一次登录记录，如果不存在则返回null
     */
    LoginRecord getLastSuccessfulLogin(Long userId);
    
    /**
     * 统计用户在指定时间内的登录失败次数
     *
     * @param userId 用户ID
     * @param minutes 时间范围（分钟）
     * @return 登录失败次数
     */
    long countRecentFailedLogins(Long userId, int minutes);
    
    /**
     * 检测可疑登录行为
     * 例如：短时间内多次登录失败、异常地理位置登录等
     *
     * @param userId 用户ID
     * @param ipAddress 当前登录IP地址
     * @return 是否存在可疑行为
     */
    boolean detectSuspiciousActivity(Long userId, String ipAddress);
    
    /**
     * 获取用户登录设备列表
     *
     * @param userId 用户ID
     * @return 该用户已登录的不同设备列表
     */
    List<String> getUserDevices(Long userId);
    
    /**
     * 查询指定时间段内的所有登录记录
     *
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param pageable 分页参数
     * @return 分页的登录记录
     */
    Page<LoginRecord> getLoginRecordsBetween(LocalDateTime startTime, LocalDateTime endTime, Pageable pageable);
    
    /**
     * 从请求中解析用户代理信息
     *
     * @param request HTTP请求
     * @return 设备类型
     */
    LoginRecord.DeviceType detectDeviceType(HttpServletRequest request);
    
    /**
     * 从IP地址解析地理位置
     *
     * @param ipAddress IP地址
     * @return 地理位置信息
     */
    String resolveLocation(String ipAddress);
} 